<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>03_Object扩展</title>
</head>
<body>
<!--
ES5给Object扩展了一些静态方法, 常用的2个:
1. Object.create(prototype, [descriptors])
  * 作用: 以指定对象为原型创建新的对象
  * 为新的对象指定新的属性, 并对属性进行描述
    - value : 指定值
    - writable : 标识当前属性值是否是可修改的, 默认为false
    - configurable: 标识当前属性是否可以被删除 默认为false
    - enumerable： 标识当前属性是否能用for in 枚举 默认为false
2. Object.defineProperties(object, descriptors)
  * 作用: 为指定对象定义扩展多个属性
    * get ：用来获取当前属性值得回调函数
    * set ：修改当前属性值得触发的回调函数，并且实参即为修改后的值
   * 存取器属性：setter,getter一个用来存值，一个用来取值
-->
<script type="text/javascript">
    var obj={username:'damu',age:30};
    var obj1={}

    obj1=Object.create(obj,{
        gender:{
            value:'男',
            writable:true,
            configurable:true,
            enumerable:true
        },
        score:{
            value:function () {
                alert(1);
            }
        }
    })
  console.log(obj1);
  console.log(obj1.username);
    obj1.gender="女";
  console.log(obj1.gender);
  /*delete obj1.gender;
  console.log(obj1);*/
  for(var i in obj1){
      console.log(i)
  }

    // Object.defineProperties(object, descriptors)
    var obj2={firstname:'kobi',lastname:'bb'};
  Object.defineProperties(obj2,{
      fullname:{
          get:function () { //惰性求值 用来获取当前属性值的回调函数
              return this.firstname+this.lastname
          },
          set:function (data) { //监听扩展属性，当扩展属性发生变化的时候回自动调用,自动调用后，会将变化的值作为实参传进set函数
              console.log('set()的设置',data)
              var name =data.split('');
              this.firstname=name[0];
              this.lastname=name[1];
          }
      }
  })
    console.log(obj2);
    console.log(obj2.fullname)

  obj2.fullname="kk";
  console.log(obj2.fullname)

</script>
</body>
</html>